home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / UTIL.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  8KB  |  296 lines

  1. UNIT Util;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Utility procedures and functions              Last changed: 02.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, Dos, OpDate, OpEntry, PoPTypes{,FuncSrvr};
  16.  
  17. {$IFNDEF OS2}
  18. CONST
  19.   BiosTics : ^LongInt = NIL;
  20. {$ENDIF}
  21.  
  22. PROCEDURE FreeUpMemory;
  23. FUNCTION  Max64k(Size: LongInt): Word;
  24.  
  25. FUNCTION  Min(a, b: LongInt): LongInt;
  26. PROCEDURE Pause(t: Word);
  27. FUNCTION  GotESC : Boolean;
  28. PROCEDURE AddToCallList(Dir: Byte; CONST Adr: TFidoAddress; CONST s: S35);
  29. PROCEDURE FinishPortal;
  30. PROCEDURE SpawnWithErrorlevel(l: Integer; CONST s: String; MakeBusy: Boolean);
  31. PROCEDURE ErrorHandler;
  32. PROCEDURE AskError(YPos: Byte; CONST Txt: S80; ColorLevel: Byte);
  33. PROCEDURE UserInformation(YPos: Byte; CONST Txt: S80; ColorLevel: Byte; Hlp:WORD);
  34. FUNCTION  AskFinish : Boolean;
  35. PROCEDURE ConfigPostEdit(Esr: EntryScreenPtr);
  36. FUNCTION  ArcCommand(ArcNum, CmdNum: Byte; CONST Arc, Spec: PathStr): Boolean;
  37. FUNCTION  TimeIsBetween(Time1, Time2: Time): Boolean;
  38. {$IFNDEF OS2}
  39. PROCEDURE FindClose(VAR Sr: SearchRec);
  40. {$ENDIF}
  41.  
  42. IMPLEMENTATION
  43.  
  44. USES OpCrt, OpWindow, OpEdit, OpString, OpPick, OpHelp, OpDos, OpKey,
  45.      ApTimer, Dpmi,
  46. {$IFNDEF PMode}
  47.      OpMacro,
  48. {$ENDIF}
  49. {$IFDEF StackCheck}
  50.      OpStack,
  51. {$ENDIF}
  52.      FileUtil, OproUtil, StrUtil, Keyboard, LogFile, ScrBlank, Display,
  53.      NodeList, DosShell, MTask, Globals, MailUtil, Com, Modem;
  54.  
  55.  
  56.   PROCEDURE FreeUpMemory;
  57.   BEGIN
  58.     DeAllocateNodelistIndex;
  59.     DisposeNodesIdx;
  60.     IF MainMenu<>NIL THEN
  61.     BEGIN
  62.       Dispose(MainMenu, Done);
  63.       MainMenu:=NIL;
  64.     END;
  65.   END;
  66.  
  67.   FUNCTION Max64k(Size: LongInt): Word;
  68.   BEGIN
  69.     IF Size>65520 THEN Max64k:=65520 ELSE Max64k:=Size;
  70.   END;
  71.  
  72.   FUNCTION Min(a, b: LongInt): LongInt;
  73.   BEGIN
  74.     IF a<b THEN Min:=a ELSE Min:=b;
  75.   END;
  76.  
  77.  
  78.   FUNCTION TimeIsBetween(Time1, Time2: Time): Boolean;
  79.   BEGIN
  80.     IF Time1=Time2 THEN
  81.       TimeIsBetween:=True
  82.     ELSE
  83.       IF Time2>=Time1 THEN
  84.       BEGIN
  85.         TimeIsBetween:=(CurrentTime>=Time1) And (CurrentTime<=Time2);
  86.       END ELSE
  87.       BEGIN
  88.         TimeIsBetween:=Not ((CurrentTime>=Time2) And (CurrentTime<=Time1));
  89.       END;
  90.   END;
  91.  
  92.   PROCEDURE Pause(t: Word);
  93.   VAR
  94.     tt: EventTimer;
  95.   BEGIN
  96.     NewTimer(tt, Secs2Tics(t) DIV 100);
  97.     WHILE Not TimerExpired(tt) DO
  98.       GiveUpTime;
  99.   END;
  100.  
  101.   FUNCTION ArcCommand(arcnum,cmdnum:BYTE; CONST arc,spec:PathStr):BOOLEAN;
  102.   VAR
  103.     prg,prg2,s:STRING;
  104.     Temp:WindowPtr;
  105.     i : Integer;
  106.   BEGIN
  107.     ArcCommand:=False;
  108.     ArcNum:=Abs(ArcNum);
  109.     IF ArcNum=0 THEN ArcNum:=3;
  110.     IF ArcNum IN [1..7] THEN
  111.     BEGIN
  112.       CASE cmdnum OF
  113.         1 : s:=Cfg.Packer[arcnum].AddCmd;
  114.         2 : s:=Cfg.Packer[arcnum].UnPackCmd;
  115.         3 : s:=Cfg.Packer[arcnum].EraseCmd;
  116.         4 : s:=Cfg.Packer[arcnum].TestCmd;
  117.       END;
  118.       IF s<>'' THEN
  119.       BEGIN
  120.         prg:=COPY(s,1,POS(' ',s)-1);
  121.         prg2:=FExpand(FSearch(prg,'.;'+GetEnv('PATH')));
  122.         Delete(s,1,Length(prg)+1);
  123.         Replace(s,'$archive',arc,0);
  124.         Replace(s,'$filespec',spec,0);
  125.         MyWin(Temp,1,1,80,ScreenHeight,0,'',False);
  126.         WriteLn('Executing: '+JustFileName(Prg2)+' '+s);
  127.         i:=ShellToDos(prg2,s,False);
  128.         IF i<>0 THEN AddLog('!','Error '+Long2Str(i)+' running: "'+JustFileName(Prg2)+' '+s+'"');
  129.         KillWindow(Temp);
  130.         ArcCommand:=(i=0) AND (DosExitCode=0);
  131.       END;
  132.     END;
  133.   END;
  134.  
  135.   PROCEDURE ConfigPostEdit(Esr: EntryScreenPtr);
  136.   BEGIN
  137.     IF ESR^.CurrentFieldModified THEN ConfigChanged:=True;
  138.   END;
  139.  
  140.   FUNCTION GotESC : Boolean;
  141.   BEGIN
  142.     GotESC:=PoPKeyPressed AND (PoPReadKeyWord=Esc);
  143.   END;
  144.  
  145.   PROCEDURE AddToCallList(Dir: Byte; CONST Adr: TFidoAddress; CONST s: S35);
  146.   VAR
  147.     i              : Byte;
  148.   BEGIN
  149.     i:=0;
  150.     REPEAT
  151.       Inc(i);
  152.     UNTIL (i = 5) OR (Data.Calls[Dir,i].Adr.Zone=0);
  153.     IF (Data.Calls[Dir,5].Adr.Zone<>0) THEN Move(data.Calls[Dir,2], data.Calls[Dir,1], 4 * 29);
  154.     WITH Data.Calls[Dir,i].Adr DO
  155.     BEGIN
  156.       Zone:=Adr.Zone;
  157.       Net:=Adr.Net;
  158.       Node:=Adr.Node;
  159.       Point:=Adr.Point;
  160.     END;
  161.     Data.Calls[Dir,i].Name:=s;
  162.     Data.Calls[Dir,i].T:=CurrentTime;
  163.     IF ScreenHeight>LinesForStat THEN
  164.       IF Dir=1 THEN UpdateCallsWindow(CallsIn,1) ELSE UpdateCallsWindow(CallsOut,2);
  165.   END;
  166.  
  167.   FUNCTION AskFinish : Boolean;
  168.   VAR
  169.     TempWin        : windowptr;
  170.     x              : Byte;
  171.     c              : Char;
  172.     InKey          : Word;
  173.   BEGIN
  174.     mywin(TempWin, 15, 9, 66, 12, 2, 'Leaving PORTAL ??',True);
  175.     WITH TempWin^ DO
  176.     BEGIN
  177.       wFastText('Resuming operation in   second(s)',1,2);
  178.       wFastText('Hit ESC again to finish portal, Enter to resume.',2,2);
  179.     END;
  180.     WHILE PopKeyPressed DO
  181.       InKey:=PopReadKeyWord;
  182.     x:=49; InKey:=0;
  183.     REPEAT
  184.       c:=CHAR(48+(x DIV 10 + 1));
  185.       TempWin^.wFastText(c,1,24);
  186.       Dec(x);
  187.       Pause(10);
  188.       IF PoPKeyPressed THEN InKey:=PopReadKeyWord;
  189.     UNTIL (x <= 0) OR (Lo(InKey)=13) OR (InKey=Esc) Or (InKey=AltX);
  190.     AskFinish:=(InKey=Esc) or (InKey=AltX);
  191.     KillWindow(TempWin);
  192.   END;
  193.  
  194.   PROCEDURE AskError(ypos:BYTE; CONST Txt:S80; colorlevel:BYTE);
  195.   VAR
  196.     Temp:WindowPtr;
  197.     x:BYTE;
  198.   BEGIN
  199.     x:=(65-Length(Txt)) DIV 2;
  200.     mywin(Temp,x,ypos,x+16+Length(Txt),ypos+2,ColorLevel,'Error',True);
  201.     FASTWRITE(txt+' - Hit RETURN',ypos+1,x+2,cfg.color[3].TextColor);
  202.     REPEAT
  203.     UNTIL PopReadKeyWord=Enter;
  204.     KillWindow(Temp);
  205.   END;
  206.  
  207.   PROCEDURE UserInformation(YPos: Byte; CONST Txt: S80; ColorLevel: Byte; Hlp:WORD);
  208.   VAR
  209.     Temp:WindowPtr;
  210.     x:BYTE;
  211.     OldHelp:WORD;
  212.   BEGIN
  213.     OldHelp:=Topic;
  214.     Topic:=Hlp;
  215.     x:=(65-Length(Txt)) DIV 2;
  216.     mywin(Temp,x,ypos,x+16+Length(Txt),ypos+2,ColorLevel,'Information',True);
  217.     Temp^.wFASTWRITE(txt+' - Hit RETURN',1,2,cfg.color[3].TextColor);
  218.     REPEAT
  219.     UNTIL PopReadKeyWord=Enter;
  220.     KillWindow(Temp);
  221.     Topic:=OldHelp;
  222.   END;
  223.  
  224.   PROCEDURE FinishPortal;
  225.   VAR
  226.     f : FILE OF TDataFile;
  227.     f1: FILE OF TPortalStat;
  228.   BEGIN
  229.     DeAllocateNodeListIndex;
  230.     DisposeNodesIdx;
  231.     Assign(f, AddBackSlash(StartPath)+MakeTaskFileName(PoPDataFileName));
  232.     Rewrite(f);
  233.     Write(f, data);
  234.     Close(f);
  235.     Assign(f1, AddBackSlash(StartPath)+MakeTaskFileName(PoPStatisticsFileName));
  236.     Rewrite(f1);
  237.     Write(f1, StatRec^);
  238.     Close(f1);
  239.     Dispose(StatRec);
  240. {   FinishFunctionServer;}
  241.   END;
  242.  
  243.   PROCEDURE ErrorHandler;
  244.   BEGIN
  245.     ExitProc:=OldErrPtr;
  246.     TurnScreen(On);
  247. {$IFNDEF OS2}
  248.     SetCBreak(SaveBreakState);
  249. {$ENDIF}
  250.     IF NOT Cfg.Screen.KeepOffScrMode AND (ScreenHeight>25) THEN
  251.     BEGIN
  252.       ScrollWindowUp(1, 1, 80, ScreenHeight, ScreenHeight-25);
  253.       SelectFont8x8(False);
  254.     END;
  255.     NormalCursor;
  256.     IF ErrorAddr<>Nil THEN
  257.     BEGIN
  258.       ComPort^.SetDtr(Off);
  259.       AddLog('!','FunTime Error '+Long2Str(ExitCode)+' at: '+HexPtr(ErrorAddr)+' - Get DRUNK!');
  260.       ErrorAddr:=Nil; ExitCode:=0;
  261. {$IFDEF StackCheck}
  262.       LogStackUsage;
  263. {$ENDIF}
  264.     END;
  265.     CloseFiles(True);
  266.     TextAttr:=$07;
  267.     GotoXYAbs(1, ScreenHeight);
  268.   END;
  269.  
  270.   PROCEDURE SpawnWithErrorlevel(l: Integer; CONST s: String; MakeBusy: Boolean);
  271.   VAR
  272.     Elevel         : String[3];
  273.   BEGIN
  274.     IF MakeBusy THEN MakeModemBusy;
  275.     Str(l, Elevel);
  276.     AddLog(':', s + ' with errorlevel ' + Elevel);
  277. {$IFDEF StackCheck}
  278.     LogStackUsage;
  279. {$ENDIF}
  280.     AddLog('+', 'End, Portal of Power v' + Ver);
  281.     FinishPortal;
  282.     Halt(l);
  283.   END;
  284.  
  285. {$IFNDEF OS2}
  286.   PROCEDURE FindClose(VAR Sr: SearchRec);
  287.   BEGIN
  288.   END;
  289. {$ENDIF}
  290.  
  291. {$IFNDEF OS2}
  292. BEGIN
  293.   BiosTics := Ptr(BiosDataSele, $6C);
  294. {$ENDIF}
  295. END.
  296.